このページはECMAScript® 2020 Language Specificationの 16 Error Handling and Language Extensions章をJavaScriptの学習目的で私的に日本語訳したものであり、直訳と意訳および推測が混在しています。そのため内容については正確ではない可能性があります。正確な情報を知りたい場合は、原文をご覧ください。また一部訳者によるコメントが含まれていることがあります。※このサイトの内容で損害や不利益を受けたとしても当方は一切の責任を負いません。
早期エラー
実装は、関連するECMAScript言語構造の評価時に、エラーを報告する必要があります。 早期エラーは、エラーを含むScript内の構成の評価前に検出および報告されるエラーです。 早期エラーは、構成の評価を中止します。 実装は、ParseScriptでScriptを解析する一環として、Scriptの早期エラーを報告する必要があります。 Moduleの早期エラーは、 Moduleが評価され、 Moduleが初期化されない時点で報告されます。 evalコードの早期エラーは、evalが呼び出されたときに報告され、evalコードの評価を中止します。 早期エラーではないすべてのエラーは実行時エラーです。
実装は、この仕様の項目名に「静的セマンティクス:初期エラー」が含まれている項目で挙げられている状態が発生したとき、早期エラーとして報告する必要があります。
コンパイラが構成前に、初期エラー以外のエラーで中断を余儀なくされたとしても、実装は他の種類のエラーを初期エラーとして扱わないものとします。 このような場合、実装は早期警告を発行する可能性がありますが、関連する構成が実際に実行されるまでエラーを報告しないでください。
実装は、以下を除いて、指定されたとおりにすべてのエラーを報告するものとします。
- 16.1で制限されている場合を除き、実装では、Script構文、Module構文、および正規表現パターンまたはフラグ構文を拡張できます。 これを許可するために、SyntaxErrorのスローが許可されているすべての操作(evalの呼び出し、正規表現リテラルの使用、FunctionまたはRegExpコンストラクターの使用など)は、実装に遭遇したときにSyntaxErrorをスローする代わりに、スクリプト構文または正規表現パターンまたはフラグ構文の拡張を実装定義した動作を示すことができます。
- 16.1で制限されている場合を除き、実装は、この仕様で説明されているもの以外に、追加の型、値、オブジェクト、プロパティ、および関数を提供する場合があります。 これにより、コンストラクト(グローバルスコープで変数を検索するなど)が、エラー(ReferenceErrorなど)をスローする代わりに、実装で定義された動作をする可能性があります。
16.1 禁止されている拡張機能(Forbidden Extensions)
実装は、次の方法でこの仕様を拡張してはいけません。
- strictモードコードで構文コンストラクターを使用して定義されたECMAScript関数オブジェクトは、"caller"または"arguments"という名前の独自プロパティを使用してはいけません。また、strictモードコードかどうかに関係なく、ArrowFunction、MethodDefinition、GeneratorDeclaration、GeneratorExpression、AsyncGeneratorDeclaration、AsyncGeneratorExpression、ClassDeclaration、ClassExpression、AsyncFunctionDeclaration、AsyncFunctionExpression、AsyncArrowFunctionを使用して定義された関数オブジェクトも同様です。 組み込み関数、Functionコンストラクターを使用して作成されたstrict関数、Generatorコンストラクターを使用して作成されたジェネレーター関数、AsyncFunctionコンストラクターを使用して作成された非同期関数、およびbindメソッドを使用して作成された関数も、同様です。
- 実装が"caller"という名前の独自プロパティを持つ関数オブジェクトを拡張する場合、[[Get]]または[[GetOwnProperty]]で参照されるそのプロパティの値はstrict関数オブジェクトであってはなりません。 アクセサプロパティの[[Get]]属性は、呼び出されたときにstrict関数を返してはいけません。
- マップされているされていないにかかわらずargumentsオブジェクトは、"caller"という名前の独自プロパティを使用して作成することはできません。
- ECMA-402で指定されている場合を除き、次のメソッドの動作を拡張しないでください。
Object.prototype.toLocaleString、Array.prototype.toLocaleString、Number.prototype.toLocaleString、 Date.prototype.toLocaleDateString、Date.prototype.toLocaleString、Date.prototype.toLocaleTimeString、String.prototype.localeCompare、%TypedArray%.prototype.toLocaleString - 21.2.1およびB.1.4のRegExpパターン文法を拡張において、[U]文法パラメーターが存在する場合、ソース文字A-Zまたはa-zをIdentityEscape[+U]として認識してはいけません。
- 構文文法において、BindingIdentifierの非終端記号に一致するソーステキストの直後に、トークン : を続けることができるように拡張してはいけません。
- strictモードコードを処理する場合、B.1.1で説明されているように、NumericLiteralの構文を拡張してLegacyOctalIntegerLiteralを含めたり、DecimalIntegerLiteralの構文を拡張してNonOctalDecimalIntegerLiteralを含めてはいけません。
- TemplateCharacterは、B.1.2で定義されているLegacyOctalEscapeSequenceを含むように拡張してはいけません。
- strictモードコードを処理する場合、B.3.2、B.3.3、B.3.4、およびB.3.6で定義されている拡張機能をサポートしてはいけません。
- Moduleゴールシンボルを解析する場合、B.1.3で定義されているレキシカル文法拡張をサポートしてはいけません。
- ImportCallを拡張してはいけません。